home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2010 April
/
PCWorld0410.iso
/
redakcyjne
/
programy
/
Tlen 6.0.1.12 pl
/
tleninst60112.exe
/
sdk
/
Plugin_src
/
menu-vc
/
demoplugin.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2006-09-18
|
8KB
|
269 lines
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include "../../TlenSources/plugin/plugin_struct.h"
#include "../../TlenSources/plugin/plugin_menu.h"
#include "../../TlenSources/plugin/plugin_procaddr.h"
#include "../../TlenSources/plugin/sl_struct.h"
#include "../../TlenSources/plugin/cl_struct.h"
#include "AggressiveOptimize.h"
//Tymczasowe definicje, bΩdzie oddzielny plik nag│≤wkowy
#define PROTOCOL_ID_TLEN "TLEN"
#define PROTOCOL_ID_GG "GG"
#define PROTOCOL_ID_SMS "SMS"
#define PROTOCOL_ID_GROUP "GRP"
HINSTANCE hInst;
TLENPLUGINFUNCTIONS *tlen_functions;
sl_add_type sl_add;
HANDLE menuitem1, menuitem2;
#define TEST_MENU_ITEM_1 "MenuPlugin/TestItem1"
#define TEST_MENU_ITEM_2 "MenuPlugin/TestItem2"
#define TEST_MENU_ITEM_3 "MenuPlugin/TestItem3"
#define TEST_MENU_ITEM_4 "MenuPlugin/TestItem4"
#define TEST_MENU_ITEM_5 "MenuPlugin/TestItem5"
#define TEST_MENU_ITEM_6 "MenuPlugin/TestItem6"
TLENPLUGININFO pluginInfo={
sizeof(TLENPLUGININFO),
"Wykorzystanie menu - VC++",
PLUGIN_API_VERSION,
MAKE_DWORD_VERSION(1,0,0,0),
"Plugin pokazuje funkcje menu - dodawanie pozycji, kasowanie, szukanie, zmianΩ parametr≤w, dodawanie funkcji callback do menu, etc.",
"Prawa autorskie",
"Producent",
"E@mail",
"http://www",
0,
0,
0,
0
};
extern "C" __declspec(dllexport) TLENPLUGININFO* GetPluginInfo(DWORD TlenVersion);
extern "C" __declspec(dllexport) int LoadPlugin(TLENPLUGINFUNCTIONS *tlen_functions);
extern "C" __declspec(dllexport) int UnloadPlugin(void);
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
hInst=hinstDLL;
return TRUE;
}
__declspec(dllexport) TLENPLUGININFO* GetPluginInfo(DWORD tlenVersion)
{
return &pluginInfo;
}
static int MenuItemEvent(WPARAM wParam, LPARAM lParam)
{
//Znajdziemy i usuniemy pozycje "Powiadom znajomego" w menu glownym
TlenMenuItemDefinition mi;
InitializeStruct(mi);
mi.Flags = TMIS_ITEMID;
mi.Item_ID = MI_MAIN_NOTIFYFRIEND;
TlenMenuItemDefinition *item = (TlenMenuItemDefinition *) tlen_functions->CallTlenFunction(hInst, TLEN_FIND_MENU_ITEM, (WPARAM) &mi, NULL);
if (item)
{
if (tlen_functions->CallTlenFunction(hInst, TLEN_DELETE_MENU_ITEM, (WPARAM) item->ItemHandle, NULL) == 0)
{
//szukan╣ pozycjΩ usuniΩto
MessageBox(NULL, "Pozycja usuniΩta", "OK", MB_OK);
//zmienimy teraz nasz╣ pierwsz╣ pozycjΩ
InitializeStruct(mi);
mi.Flags = TMIM_CAPTION | TMIM_FLAGS;
mi.Caption = "PozycjΩ usuniΩto poprawnie";
mi.Flags |= TMI_GRAYED | TMI_CHECKED;
tlen_functions->CallTlenFunction(hInst, TLEN_CHANGE_MENU_ITEM, (WPARAM) menuitem1, (LPARAM) &mi);
}
else
{
MessageBox(NULL, "Nie uda│o siΩ usun╣µ pozycji", "B│╣d", MB_OK);
}
}
else
{
MessageBox(NULL, "Nie uda│o siΩ odnaleƒµ pozycji", "B│╣d", MB_OK);
}
return 0;
}
static int MenuItem2Event(WPARAM wParam, LPARAM lParam)
{
TlenMenuItemDefinition *item = (TlenMenuItemDefinition *) wParam;
MenuPopupInfo *info = (MenuPopupInfo *) lParam;
//Wy£wietlimy informacjΩ o zaznaczonych na li£cie kontaktach (kontakcie)
static char text[8192];
sprintf(text, "MenuID: %s\nLocationID: %s\nItemID: %s\n\nContacts (%d):\n", info->Menu_ID, info->Location_ID,
item->Item_ID, info->Contacts.count);
for (int i = 0; i < info->Contacts.count; i++)
{
strcat(text, info->Contacts.contacts[i].ContactID);
strcat(text, " ");
strcat(text, info->Contacts.contacts[i].ProtocolID);
strcat(text, "\n");
}
MessageBox(NULL, text, "Informacje", MB_OK);
return 0;
}
static int MenuEvent(WPARAM wParam, LPARAM lParam)
{
//Tu┐ przed wy£wietleniem menu wska┐emy pozycje, kt≤re chcemy pokazaµ
if (wParam == TLEN_MENU_CALLBACK_BEFORE_POPUP)
{
MenuPopupInfo *info = (MenuPopupInfo *) lParam;
//T╣ pozycjΩ poka┐emy tylko przy kontaktach tlenowych
if (info->Contacts.count && strcmp(info->Contacts.contacts[0].ProtocolID, PROTOCOL_ID_TLEN) == 0)
{
sl_add(&(info->MenuItemsToShow), TEST_MENU_ITEM_1);
}
//A te przy wszystkich
sl_add(&(info->MenuItemsToShow), TEST_MENU_ITEM_2);
sl_add(&(info->MenuItemsToShow), TEST_MENU_ITEM_3);
sl_add(&(info->MenuItemsToShow), TEST_MENU_ITEM_4);
sl_add(&(info->MenuItemsToShow), TEST_MENU_ITEM_5);
sl_add(&(info->MenuItemsToShow), TEST_MENU_ITEM_6);
//W zale┐no£ci od tego ile jest zaznaczonych kontakt≤w zmienimy napis pozycji menu
TlenMenuItemDefinition mi;
InitializeStruct(mi);
mi.Flags = TMIM_CAPTION;
char t1[] = "Poka┐ informacje o kontakcie";
char t2[] = "Poka┐ informacje o kontaktach";
if (info->Contacts.count > 1)
{
mi.Caption = t2;
}
else
{
mi.Caption = t1;
}
tlen_functions->CallTlenFunction(hInst, TLEN_CHANGE_MENU_ITEM, (WPARAM) menuitem2, (LPARAM) &mi);
return 1;
}
return 0;
}
__declspec(dllexport) int LoadPlugin(TLENPLUGINFUNCTIONS *functions)
{
tlen_functions = functions;
sl_add = (sl_add_type) tlen_functions->CallTlenFunction(hInst, TLEN_GET_PROC_ADDRESS, TPA_SL_ADD, NULL);
TlenMenuItemDefinition mi;
InitializeStruct(mi);
HBITMAP icon = (HBITMAP) LoadImage(hInst, MAKEINTRESOURCE(101),IMAGE_BITMAP, 16, 16, NULL);
//Dodajemy po kolei wszystkie pozycje menu
mi.Item_ID = TEST_MENU_ITEM_1;
mi.Caption = "Usuwa \"Powiadom znajomego\"";
mi.Menu_ID = TLEN_MENUID_CL_ELEMENT;
mi.ModuleHandle = hInst;
mi.CallBack = MenuItemEvent;
mi.Position = 500000;
mi.Icon.Bitmap = icon;
mi.Icon.Transparent = RGB(0xBC, 0xD5, 0xE7);
mi.HotKey = MAKEWORD(70, (BYTE) MOD_CONTROL);
menuitem1 = (HANDLE) tlen_functions->CallTlenFunction(hInst, TLEN_ADD_MENU_ITEM, (WPARAM) &mi, NULL);
InitializeStruct(mi);
mi.Item_ID = TEST_MENU_ITEM_2;
mi.Menu_ID = TLEN_MENUID_CL_ELEMENT;
mi.ModuleHandle = hInst;
mi.CallBack = MenuItem2Event;
mi.Position = -500000;
menuitem2 = (HANDLE) tlen_functions->CallTlenFunction(hInst, TLEN_ADD_MENU_ITEM, (WPARAM) &mi, NULL);
InitializeStruct(mi);
mi.Item_ID = TEST_MENU_ITEM_3;
mi.Menu_ID = TLEN_MENUID_CL_ELEMENT;
mi.Caption = "Rozwijane menu";
mi.ModuleHandle = hInst;
mi.Position = 500100;
tlen_functions->CallTlenFunction(hInst, TLEN_ADD_MENU_ITEM, (WPARAM) &mi, NULL);
InitializeStruct(mi);
mi.Item_ID = TEST_MENU_ITEM_4;
mi.Menu_ID = TLEN_MENUID_CL_ELEMENT;
mi.Parent_ID = TEST_MENU_ITEM_3;
mi.Caption = "Pozycja 1";
mi.ModuleHandle = hInst;
mi.Position = 100;
tlen_functions->CallTlenFunction(hInst, TLEN_ADD_MENU_ITEM, (WPARAM) &mi, NULL);
InitializeStruct(mi);
mi.Item_ID = TEST_MENU_ITEM_5;
mi.Menu_ID = TLEN_MENUID_CL_ELEMENT;
mi.Parent_ID = TEST_MENU_ITEM_3;
mi.Caption = "Pozycja 2";
mi.ModuleHandle = hInst;
mi.Position = 10100;
tlen_functions->CallTlenFunction(hInst, TLEN_ADD_MENU_ITEM, (WPARAM) &mi, NULL);
InitializeStruct(mi);
mi.Item_ID = TEST_MENU_ITEM_6;
mi.Menu_ID = TLEN_MENUID_CL_ELEMENT;
mi.Parent_ID = TEST_MENU_ITEM_3;
mi.Caption = "Pozycja 3";
mi.ModuleHandle = hInst;
mi.Position = 10200;
tlen_functions->CallTlenFunction(hInst, TLEN_ADD_MENU_ITEM, (WPARAM) &mi, NULL);
//Dodajemy callback do menu listy kontaktow
tlen_functions->CallTlenFunction(hInst, TLEN_ADD_MENU_CALLBACK, (WPARAM) TLEN_MENUID_CL_ELEMENT, (LPARAM) MenuEvent);
DeleteObject(icon);
return 0;
}
__declspec(dllexport) int UnloadPlugin(void)
{
//Usuwamy callback menu listy kontakt≤w - je£li tego nie zrobimy po wy│adowaniu pluginu i pr≤bie pokazania menu mamy gwarantowany access violation
tlen_functions->CallTlenFunction(hInst, TLEN_REMOVE_MENU_CALLBACK, (WPARAM) TLEN_MENUID_CL_ELEMENT, (LPARAM) MenuEvent);
return 0;
}